package com.example.springboot.init;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * 多数据源配置
 * <p> 根据单数据源配置，可知根据url、username、password等属性就可以创建，多个即是配置多个DataSource。
 * 创建方式可利用beanFactory反射创建；或者直接根据配置文件进行手动创建
 *
 * <p> ConditionalOnMissingBean: 当这个bean不存在时则创建。
 * <p>
 *
 * @author Zhang.Z
 * @version 2025-09-22
 */
@ConditionalOnMissingBean(value = SingleJdbcConfig.class)
@Configuration
public class MultiJdbcConfig {


    /**
     * 方式一:
     * 此处使用DataSourceBuilder.create().build()方法。使用hikari类型。
     * 要注意driverClassName与url的配合问题，即jdbcUrl要与driverClassName配合使用，转换成hikariConfig的属性。
     * 否则调用会抛出 jdbcUrl is required with driverClassName..等问题。
     *
     * @see DataSourceBuilder#maybeGetDriverClassName
     * @see DataSourceBuilder#bind
     */
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource1")
    @Primary
    public DataSource primaryDataSource() {

        return DataSourceBuilder.create().build();
    }


    @Value("${spring.datasource2.jdbc-url}")
    private String url;

    @Value("${spring.datasource2.username}")
    private String username;

    @Value("${spring.datasource2.password}")
    private String password;

    @Value("${spring.datasource2.type}")
    private Class<? extends DataSource> type;

    @Value("${spring.datasource2.driver-class-name}")
    private String driverClassName;

    /**
     * 方式二：读取配置文件直接创建
     */
    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    public DataSource secondaryDataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        hikariConfig.setDriverClassName(driverClassName);
        return new HikariDataSource(hikariConfig);
    }

    @Bean(name = "primaryJdbcTemplate")
    @Primary
    public JdbcTemplate primaryJdbcTemplate(
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}
